import org.junit.Test;

import java.io.*;
import java.util.*;

public class Test1 {
    /**
     * ArrayList集合：
     * list接口下的一个类，是一个有序的集合，带索引(下标)的对象数组，提供了随机访问数据，
     * 遍历数据的时间（随机遍历get方法，for循环是最快的），迭代器最慢。
     * 它是一个非线程安全的类，做遍历较快
     * 用途：适用在对元素查询操作较频繁的时候
     * 特点：
     * - 有序
     * - 允许重复元素
     * - 线程不安全，删除，在特定未知插入元素都比较低效
     */
    @Test
    public void TestArrayList() {//ArrayList集合
        List<String> list = new ArrayList<String>();//创建一个ArrayList集合
        list.add("asdf1");
        list.add("asdf2");
        list.add("asdf2");
        list.add("asdf4");
        list.addAll(new ArrayList<>());//在集合里添加一个空集合
        list.add(0, "5");//将五添加到第一个
        list.clear();//清除集合
        //list.ensureCapacity(minCapacity);改变集合长度
        list.add("asdf5");
        list.add("asdf6");
        list.add("5");
        list.remove(2);//删除第二个集合元素，使用的下标
        list.remove("5");//删除5,没有则不用删除
        list.set(1, "2");//将第一个数修改为2
        System.out.println(list);
    }

    /**
     * Vector集合:
     * list接口下的类，有序的集合，可以提供随机访问，方法都是同步，线程安全的
     * 实现了链表的功能，但是查询比链表操作要快和ArrayList相同都可以用作查询
     * 特点：
     * - 线程安全
     */
    @Test
    public void Testvector() {//Vector集合
        List<String> list = new Vector<String>();//创建一个Vector集合
        list.add("asdf1");
        list.add("asdf2");
        list.add("asdf2");
        list.add("asdf4");
        list.addAll(new Vector<>());//在集合里添加一个空集合
        list.add(0, "5");//将五添加到第一个
        list.clear();//清除集合
        //list.ensureCapacity(minCapacity);改变集合长度
        list.add("asdf5");
        list.add("asdf6");
        list.add("5");
        list.remove(2);//删除第二个集合元素，使用的下标
        list.remove("5");//删除5,没有则不用删除
        list.set(1, "2");//将第一个数修改为2
        System.out.println(list);
    }

    /**
     * Iterator：
     */
    @Test
    public void iterator() {//Iterator迭代器
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("a1");
        arrayList.add("a2");
        arrayList.add("a3");
        arrayList.add("a4");
        Iterator<String> it = arrayList.iterator();//创建迭代器对象
        while (it.hasNext()) {//如果迭代器中还有元素那么返回true
            String s = it.next();//返回迭代器中游标的下一元素
            if (s.equals("a2")) {
                System.out.println(arrayList);
            }
        }
    }

    /**
     * LinkedList:
     * 实现了链表功能，对数据删除、修改效率较高，查询效率较低
     * 它是一个对象链表的集合，提供对队列中随机、头、尾的操作
     * 用途：LinkedList集合适用在对元素插入和删除操作较频繁的时候
     */
    @Test
    public void testListIterator() {//LinkedList迭代器
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("a1");
        arrayList.add("a2");
        arrayList.add("a3");
        arrayList.add("a4");
        ListIterator<String> lit = arrayList.listIterator();
        while (lit.hasNext()) {
            System.out.println(lit.next());
        }
    }

    @Test
    public void TestLinkedList() {
        LinkedList<String> llist = new LinkedList<>();
        llist.add("asdf1");
        llist.add("asdf2");
        llist.add("asdf2");
        llist.add("asdf4");
        llist.addAll(new ArrayList<>());//在集合里添加一个空集合
        llist.add(0, "5");//将五添加到第一个
        llist.clear();//清除集合
        //list.ensureCapacity(minCapacity);改变集合长度
        llist.add("asdf5");
        llist.add("asdf6");
        llist.add("5");
        llist.remove(2);//删除第二个集合元素，使用的下标
        llist.remove("5");//删除5,没有则不用删除
        llist.set(1, "2");//将第一个数修改为2
        System.out.println(llist);
    }

    @Test
    public void hashset() {
        String s1="s1";
        String s2="s2";
        String s3="s3";
        String s4="s4";
        String s5="s5";
        String s6="s6";
        HashSet<String> hashSet = new HashSet<>();
        hashSet.add(s1);
        hashSet.add(s2);
        hashSet.add(s3);
        hashSet.add(s4);
        hashSet.add(s5);
        hashSet.add(s6);
        System.out.println(hashSet);
        for(String i:hashSet){
            System.out.println(i);
        }
    }


}